#!/bin/bash

# =============================================================================
# Admin服务停止脚本
# 作者: AI Assistant
# 创建时间: $(date +%Y-%m-%d)
# =============================================================================

# 配置参数
JAR_FOLDER="/mydata/jars/yccloud17/admin"
JAR_NAME="admin-0.0.1-SNAPSHOT.jar"
PID_FILE="$JAR_FOLDER/admin.pid"
LOG_FILE="$JAR_FOLDER/admin.log"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 检查服务状态
check_status() {
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if ps -p "$PID" > /dev/null 2>&1; then
            log_info "服务正在运行，PID: $PID"
            return 0
        else
            log_warn "PID文件存在但进程已死亡，清理PID文件"
            rm -f "$PID_FILE"
            return 1
        fi
    fi
    
    # 通过进程名检查
    PID=$(pgrep -f "$JAR_NAME")
    if [ -n "$PID" ]; then
        log_info "发现同名进程，PID: $PID"
        return 0
    fi
    
    log_warn "服务未运行"
    return 1
}

# 优雅停止服务
stop_service_gracefully() {
    local PID=$1
    local TIMEOUT=30
    
    log_info "尝试优雅停止服务 (PID: $PID)..."
    
    # 发送TERM信号
    kill -TERM "$PID"
    
    # 等待进程优雅退出
    local count=0
    while [ $count -lt $TIMEOUT ]; do
        if ! ps -p "$PID" > /dev/null 2>&1; then
            log_info "服务已优雅停止"
            return 0
        fi
        sleep 1
        ((count++))
        if [ $((count % 5)) -eq 0 ]; then
            log_warn "等待服务停止... (${count}s/${TIMEOUT}s)"
        fi
    done
    
    log_warn "优雅停止超时，将强制停止"
    return 1
}

# 强制停止服务
stop_service_force() {
    local PID=$1
    
    log_warn "强制停止服务 (PID: $PID)..."
    kill -KILL "$PID"
    
    # 等待进程被杀死
    sleep 2
    
    if ! ps -p "$PID" > /dev/null 2>&1; then
        log_info "服务已强制停止"
        return 0
    else
        log_error "强制停止失败"
        return 1
    fi
}

# 停止服务
stop_service() {
    local PID=""
    
    # 获取PID
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
    else
        PID=$(pgrep -f "$JAR_NAME")
    fi
    
    if [ -z "$PID" ]; then
        log_warn "未找到运行中的服务"
        return 0
    fi
    
    log_info "停止Admin服务 (PID: $PID)..."
    
    # 尝试优雅停止
    if stop_service_gracefully "$PID"; then
        # 清理PID文件
        if [ -f "$PID_FILE" ]; then
            rm -f "$PID_FILE"
            log_info "已清理PID文件"
        fi
        return 0
    fi
    
    # 优雅停止失败，强制停止
    if stop_service_force "$PID"; then
        # 清理PID文件
        if [ -f "$PID_FILE" ]; then
            rm -f "$PID_FILE"
            log_info "已清理PID文件"
        fi
        return 0
    fi
    
    return 1
}

# 清理资源
cleanup() {
    log_info "清理资源..."
    
    # 清理PID文件
    if [ -f "$PID_FILE" ]; then
        rm -f "$PID_FILE"
        log_info "已清理PID文件"
    fi
    
    # 检查是否还有残留进程
    local remaining_pids=$(pgrep -f "$JAR_NAME")
    if [ -n "$remaining_pids" ]; then
        log_warn "发现残留进程: $remaining_pids"
        log_warn "如需清理，请手动执行: kill -9 $remaining_pids"
    fi
}

# 主函数
main() {
    log_info "开始停止Admin服务..."
    
    # 检查服务状态
    if ! check_status; then
        log_info "服务未运行，无需停止"
        cleanup
        exit 0
    fi
    
    # 停止服务
    if stop_service; then
        log_info "Admin服务停止成功！"
        cleanup
        exit 0
    else
        log_error "Admin服务停止失败！"
        exit 1
    fi
}

# 执行主函数
main "$@"


